home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / OSEmu / mathffp.s < prev    next >
Encoding:
Text File  |  2001-03-19  |  6.9 KB  |  436 lines

  1. * $Id: mathffp.s 1.1 1999/02/03 04:09:05 jotd Exp $
  2.  
  3. **************************************************************************
  4. *   MATHFFP-LIBRARY                                                      *
  5. **************************************************************************
  6. **************************************************************************
  7. *   INITIALIZATION                                                       *
  8. **************************************************************************
  9.  
  10. MATHFFPINIT    move.l    _mffpbase,d0
  11.         beq    .init
  12.         rts
  13.  
  14. .init        move.l    #-_LVOSPDiv,d0
  15.         move.l    #LIB_SIZE,D1
  16.         lea    _mffpname,a0
  17.         jsr    _InitLibrary
  18.         move.l    d0,a0
  19.         move.l    d0,_mffpbase
  20.  
  21.         patch    _LVOSPFlt(a0),SPFlt
  22.         patch    _LVOSPFix(a0),SPFix
  23.         patch    _LVOSPDiv(a0),SPDiv
  24.         patch    _LVOSPMul(a0),SPMul
  25.         patch    _LVOSPAdd(a0),SPAdd
  26.         patch    _LVOSPSub(a0),SPSub
  27.         patch    _LVOSPCmp(a0),SPCmp
  28.         
  29.         rts
  30.  
  31. ; < D0: signed int
  32. ; > D0: double precision float
  33.  
  34.     dc.b    "SPFlt",0    
  35. SPFlt:
  36.     MOVEQ    #95,D1
  37.     TST.L    D0
  38.     BEQ.S    .lab_0003
  39.     BPL.S    .lab_0000
  40.     MOVEQ    #-32,D1
  41.     NEG.L    D0
  42.     BVS.S    .lab_0002
  43.     SUBQ.B    #1,D1
  44. .lab_0000:
  45.     CMP.L    #$00007FFF,D0
  46.     BHI.S    .lab_0001
  47.     SWAP    D0
  48.     SUB.B    #$10,D1
  49. .lab_0001:
  50.     ADD.L    D0,D0
  51.     DBMI    D1,.lab_0001
  52.     TST.B    D0
  53.     BPL.S    .lab_0002
  54.     ADD.L    #$00000100,D0
  55.     BCC.S    .lab_0002
  56.     ROXR.L    #1,D0
  57.     ADDQ.B    #1,D1
  58. .lab_0002:
  59.     MOVE.B    D1,D0
  60. .lab_0003:
  61.     RTS
  62.  
  63. SPFlt_jotd:
  64.     tst.l    D0
  65.     beq.b    .exit
  66.     
  67.     movem.l    D1-D2,-(A7)
  68.  
  69.     move.w    #$40,D2
  70.  
  71.     btst    #31,D0
  72.     beq    .positive
  73.     move.w    #$C0,D2
  74.     neg.l    D0
  75. .positive:
  76.     move.l    D0,D1
  77. .sh1loop:
  78.     tst.l    D1
  79.     beq.b    .sh1out
  80.     addq.l    #1,D2
  81.     lsr.l    #1,D1
  82.     bra.b    .sh1loop
  83. .sh1out:
  84.  
  85. .sh2loop:
  86.     btst    #31,D0
  87.     bne.b    .sh2out
  88.     add.l    D0,D0
  89.     bra.b    .sh2loop
  90. .sh2out:
  91.     or.w    D2,D0
  92.  
  93.     movem.l    (A7)+,D1-D2
  94.  
  95. .exit
  96.     rts
  97.     
  98. ; SPDiv:
  99. ; < D0 : numerator
  100. ; < D1 : divisor
  101. ; > D0 : result
  102. ;
  103. ; Ripped and adapted by JOTD from ROM code (shame :) )
  104.  
  105.     dc.b    "SPDiv",0
  106. SPDiv:
  107.     MOVEM.L    D3-D5,-(A7)        ;18: 48E71C00
  108.     MOVE.B    D1,D5            ;1C: 1A01
  109.     beq    .divbyzero
  110.     MOVE.L    D0,D4            ;20: 2800
  111.     BEQ    .rslt0            ;22: 67DC
  112.     MOVEQ    #-128,D3        ;24: 7680
  113.     ADD    D5,D5            ;26: DA45
  114.     ADD    D4,D4            ;28: D844
  115.     EOR.B    D3,D5            ;2A: B705
  116.     EOR.B    D3,D4            ;2C: B704
  117.     SUB.B    D5,D4            ;2E: 9805
  118.     BVS.S    .overflow
  119.     CLR.B    D0            ;32: 4200
  120.     SWAP    D0            ;34: 4840
  121.     SWAP    D1            ;36: 4841
  122.     CMP    D1,D0            ;38: B041
  123.     BMI.S    .LAB_0005        ;3A: 6B06
  124.     ADDQ.B    #2,D4            ;3C: 5404
  125.     BVS.S    .overflow
  126.     ROR.L    #1,D0            ;40: E298
  127. .LAB_0005:
  128.     SWAP    D0            ;42: 4840
  129.     MOVE.B    D3,D5            ;44: 1A03
  130.     EOR    D5,D4            ;46: BB44
  131.     LSR    #1,D4            ;48: E24C
  132.     MOVE.L    D0,D3            ;4A: 2600
  133.     DIVU    D1,D3            ;4C: 86C1
  134.     MOVE    D3,D5            ;4E: 3A03
  135.     MULU    D1,D3            ;50: C6C1
  136.     SUB.L    D3,D0            ;52: 9083
  137.     SWAP    D0            ;54: 4840
  138.     SWAP    D1            ;56: 4841
  139.     MOVE    D1,D3            ;58: 3601
  140.     CLR.B    D3            ;5A: 4203
  141.     MULU    D5,D3            ;5C: C6C5
  142.     SUB.L    D3,D0            ;5E: 9083
  143.     BCC.S    .LAB_0007        ;60: 6406
  144. .LAB_0006:
  145.     SUBQ    #1,D5            ;62: 5345
  146.     ADD.L    D1,D0            ;64: D081
  147.     BCC.S    .LAB_0006        ;66: 64FA
  148. .LAB_0007:
  149.     MOVE.L    D1,D3            ;68: 2601
  150.     SWAP    D3            ;6A: 4843
  151.     CLR    D0            ;6C: 4240
  152.     DIVU    D3,D0            ;6E: 80C3
  153.     SWAP    D5            ;70: 4845
  154.     BMI.S    .LAB_0008        ;72: 6B08
  155.     MOVE    D0,D5            ;74: 3A00
  156.     ADD.L    D5,D5            ;76: DA85
  157.     SUBQ.B    #1,D4            ;78: 5304
  158.     MOVE    D5,D0            ;7A: 3005
  159. .LAB_0008:
  160.     MOVE    D0,D5            ;7C: 3A00
  161.     ADD.L    #$00000080,D5        ;7E: DABC00000080
  162.     MOVE.L    D5,D0            ;84: 2005
  163.     MOVE.B    D4,D0            ;86: 1004
  164.     BEQ.S    .rslt0
  165. .exit:
  166.     MOVEM.L    (A7)+,D3-D5        ;8A: 4CDF0038
  167.     RTS                ;8E: 4E75
  168.  
  169. .rslt0:
  170.     MOVEQ    #0,D0            ;10: 7000
  171.     bra.b    .exit
  172.  
  173. .overflow:
  174. .divbyzero:
  175.     move.l    #$7FFFFF,D0
  176.     bra    SPFlt        ; big value
  177.  
  178.     dc.b    "SPMul",0
  179. SPMul:
  180.     MOVEM.L    D3-D5,-(A7)
  181.     MOVE.B    D0,D5
  182.     BEQ.S    lmul_0000
  183.     MOVE.B    D1,D4
  184.     BEQ.S    lmul_0003
  185.     ADD    D5,D5
  186.     ADD    D4,D4
  187.     MOVEQ    #-128,D3
  188.     EOR.B    D3,D4
  189.     EOR.B    D3,D5
  190.     ADD.B    D4,D5
  191.     BVS.S    lmul_0004
  192.     MOVE.B    D3,D4
  193.     EOR    D4,D5
  194.     ROR    #1,D5
  195.     SWAP    D5
  196.     MOVE    D1,D5
  197.     CLR.B    D0
  198.     CLR.B    D5
  199.     MOVE    D5,D4
  200.     MULU    D0,D4
  201.     SWAP    D4
  202.     MOVE.L    D0,D3
  203.     SWAP    D3
  204.     MULU    D5,D3
  205.     ADD.L    D3,D4
  206.     SWAP    D1
  207.     MOVE.L    D1,D3
  208.     MULU    D0,D3
  209.     ADD.L    D3,D4
  210.     CLR    D4
  211.     ADDX.B    D4,D4
  212.     SWAP    D4
  213.     SWAP    D0
  214.     MULU    D1,D0
  215.     SWAP    D1
  216.     SWAP    D5
  217.     ADD.L    D4,D0
  218.     BPL.S    lmul_0001
  219.     ADD.L    #$00000080,D0
  220.     MOVE.B    D5,D0
  221.     BEQ.S    lmul_0003
  222. lmul_0000:
  223.     MOVEM.L    (A7)+,D3-D5
  224.     RTS
  225. lmul_0001:
  226.     SUBQ.B    #1,D5
  227.     BVS.S    lmul_0003
  228.     BCS.S    lmul_0003
  229.     MOVEQ    #64,D4
  230.     ADD.L    D4,D0
  231.     ADD.L    D0,D0
  232.     BCC.S    lmul_0002
  233.     ROXR.L    #1,D0
  234.     ADDQ.B    #1,D5
  235. lmul_0002:
  236.     MOVE.B    D5,D0
  237.     BEQ.S    lmul_0003
  238.     MOVEM.L    (A7)+,D3-D5
  239.     RTS
  240. lmul_0003:
  241.     MOVEQ    #0,D0
  242.     MOVEM.L    (A7)+,D3-D5
  243.     RTS
  244. lmul_0004:
  245.     BPL.S    lmul_0003
  246.     EOR.B    D1,D0
  247.     OR.L    #$FFFFFF7F,D0
  248.     TST.B    D0
  249.     ORI.B    #$02,CCR
  250.     MOVEM.L    (A7)+,D3-D5
  251.     RTS
  252.  
  253.     dc.b    "SPFix",0
  254. SPFix:
  255.     MOVE.B    D0,D1
  256.     BMI.S    lfix_0003
  257.     BEQ.S    lfix_0000
  258.     CLR.B    D0
  259.     SUB.B    #$41,D1
  260.     BMI.S    lfix_0002
  261.     SUB.B    #$1F,D1
  262.     BPL.S    lfix_0001
  263.     NEG.B    D1
  264.     LSR.L    D1,D0
  265. lfix_0000:
  266.     RTS
  267. lfix_0001:
  268.     MOVEQ    #-1,D0
  269.     LSR.L    #1,D0
  270.     ORI.B    #$02,CCR
  271.     RTS
  272. lfix_0002:
  273.     MOVEQ    #0,D0
  274.     RTS
  275. lfix_0003:
  276.     CLR.B    D0
  277.     SUB.B    #$C1,D1
  278.     BMI.S    lfix_0002
  279.     SUB.B    #$1F,D1
  280.     BPL.S    lfix_0004
  281.     NEG.B    D1
  282.     LSR.L    D1,D0
  283.     NEG.L    D0
  284.     RTS
  285. lfix_0004:
  286.     BNE.S    lfix_0005
  287.     NEG.L    D0
  288.     TST.L    D0
  289.     BMI.S    lfix_0000
  290. lfix_0005:
  291.     MOVEQ    #0,D0
  292.     BSET    #31,D0
  293.     ORI.B    #$02,CCR
  294.     RTS
  295.  
  296. SPSub:
  297.     MOVEM.L    D3-D5,-(A7)
  298.     MOVE.B    D1,D4
  299.     BEQ.B    LB_AS_083E
  300.     EORI.B    #$80,D4
  301.     BMI.W    LB_AS_0864
  302.     MOVE.B    D0,D5
  303.     BMI.W    LB_AS_086A
  304.     BNE.B    LB_AS_07FA
  305.     BRA.B    LB_AS_0834
  306. SPAdd:
  307.     MOVEM.L    D3-D5,-(A7)
  308.     MOVE.B    D1,D4
  309.     BMI.B    LB_AS_0864
  310.     BEQ.B    LB_AS_083E
  311.     MOVE.B    D0,D5
  312.     BMI.B    LB_AS_086A
  313.     BEQ.B    LB_AS_0834
  314. LB_AS_07FA    SUB.B    D4,D5
  315.     BMI.B    LB_AS_0846
  316.     MOVE.B    D0,D4
  317.     CMP.B    #$18,D5
  318.     BCC.B    LB_AS_083E
  319.     MOVE.L    D1,D3
  320.     CLR.B    D3
  321.     LSR.L    D5,D3
  322.     MOVE.B    #$80,D0
  323.     ADD.L    D3,D0
  324.     BCS.B    LB_AS_081C
  325. LB_AS_0814    MOVE.B    D4,D0
  326.     MOVEM.L    (A7)+,D3-D5
  327.     RTS    
  328. LB_AS_081C    ROXR.L    #1,D0
  329.     ADDQ.B    #1,D4
  330.     BVS.B    LB_AS_0824
  331.     BCC.B    LB_AS_0814
  332. LB_AS_0824    MOVEQ    #-$01,D0
  333.     SUBQ.B    #1,D4
  334.     MOVE.B    D4,D0
  335.     ORI.B    #$02,CCR
  336.     MOVEM.L    (A7)+,D3-D5
  337.     RTS    
  338. LB_AS_0834    MOVE.L    D1,D0
  339.     MOVE.B    D4,D0
  340.     MOVEM.L    (A7)+,D3-D5
  341.     RTS    
  342. LB_AS_083E    TST.B    D0
  343.     MOVEM.L    (A7)+,D3-D5
  344.     RTS    
  345. LB_AS_0846    CMP.B    #$E8,D5
  346.     BLE.B    LB_AS_0834
  347.     NEG.B    D5
  348.     MOVE.L    D1,D3
  349.     CLR.B    D0
  350.     LSR.L    D5,D0
  351.     MOVE.B    #$80,D3
  352.     ADD.L    D3,D0
  353.     BCS.B    LB_AS_081C
  354.     MOVE.B    D4,D0
  355.     MOVEM.L    (A7)+,D3-D5
  356.     RTS    
  357. LB_AS_0864    MOVE.B    D0,D5
  358.     BMI.B    LB_AS_07FA
  359.     BEQ.B    LB_AS_0834
  360. LB_AS_086A    MOVEQ    #-$80,D3
  361.     EOR.B    D3,D5
  362.     SUB.B    D4,D5
  363.     BEQ.B    LB_AS_08CC
  364.     BMI.B    LB_AS_08B8
  365.     CMP.B    #$18,D5
  366.     BCC.B    LB_AS_083E
  367.     MOVE.B    D0,D4
  368.     MOVE.B    D3,D0
  369.     MOVE.L    D1,D3
  370. LB_AS_0880    CLR.B    D3
  371.     LSR.L    D5,D3
  372.     SUB.L    D3,D0
  373.     BMI.B    LB_AS_0814
  374. LB_AS_0888    MOVE.B    D4,D5
  375. LB_AS_088A    CLR.B    D0
  376.     SUBQ.B    #1,D4
  377.     CMP.L    #$00007FFF,D0
  378.     BHI.B    LB_AS_089C
  379.     SWAP    D0
  380.     SUB.B    #$10,D4
  381. LB_AS_089C    ADD.L    D0,D0
  382.     DBMI    D4,LB_AS_089C
  383.     EOR.B    D4,D5
  384.     BMI.B    LB_AS_08B0
  385.     MOVE.B    D4,D0
  386.     BEQ.B    LB_AS_08B0
  387.     MOVEM.L    (A7)+,D3-D5
  388.     RTS    
  389. LB_AS_08B0    MOVEQ    #$00,D0
  390.     MOVEM.L    (A7)+,D3-D5
  391.     RTS    
  392. LB_AS_08B8    CMP.B    #$E8,D5
  393.     BLE.W    LB_AS_0834
  394.     NEG.B    D5
  395.     MOVE.L    D0,D3
  396.     MOVE.L    D1,D0
  397.     MOVE.B    #$80,D0
  398.     BRA.B    LB_AS_0880
  399. LB_AS_08CC    MOVE.B    D0,D5
  400.     EXG    D5,D4
  401.     MOVE.B    D1,D0
  402.     SUB.L    D1,D0
  403.     BEQ.B    LB_AS_08B0
  404.     BPL.B    LB_AS_0888
  405.     NEG.L    D0
  406.     MOVE.B    D5,D4
  407.     BRA.B    LB_AS_088A
  408.  
  409. SPCmp:
  410.     TST.B    D1
  411.     BPL.B    .LB_076C
  412.     TST.B    D0
  413.     BPL.B    .LB_076C
  414.     CMP.B    D0,D1
  415.     BNE.B    .LB_0772
  416.     CMP.L    D0,D1
  417.     BRA.B    .LB_0772
  418. .LB_076C    CMP.B    D1,D0
  419.     BNE.B    .LB_0772
  420.     CMP.L    D1,D0
  421. .LB_0772    MOVEM.L    A6,-(A7)
  422.     MOVE.L    $4.W,A6
  423.     JSR    -528(A6)
  424.     MOVE.L    (A7)+,A6
  425.     MOVE.W    D0,D1
  426.     MOVEQ    #$00,D0
  427.     MOVE    D1,CCR
  428.     BLT.B    .LB_0792
  429.     BGT.B    .LB_078E
  430.     BRA.B    .LB_0794
  431. .LB_078E    SUBQ.L    #1,D0
  432.     BRA.B    .LB_0794
  433. .LB_0792    ADDQ.L    #1,D0
  434. .LB_0794    MOVE    D1,CCR
  435.     RTS    
  436.